package com.egghiro.framework.j2se.game.controller.action;

import com.egghiro.framework.j2se.game.core.model.actor.IPoint2D;
import com.egghiro.framework.j2se.game.core.model.actor.ISprite;
import com.egghiro.framework.j2se.game.model.element.LinearVelocity2D;

/**
 * 绕中心点旋转（按圆形轨道移动）的Action
 * 
 * @project SGame
 * @date: 2013-5-26
 * @version 0.1
 */
public class GoRoundAction extends Action {
    private ISprite actor;
    /**
     * 中心点 The center of the circle
     */
    private IPoint2D center;
    // /**
    // * 半径
    // */
    // private int radius;
    // /**
    // * 当前的方向(度)
    // * ※0度 = 朝右
    // * 90度 = 朝下
    // */
    // private double angleInDigree;

    /**
     * 半径向量
     */
    private LinearVelocity2D radiusVector;

    /**
     * 角速度(度/帧)
     */
    private double angleStepInDigree;

    protected IPoint2D getCenter() {
        return center;
    }

    protected void setCenter(IPoint2D center) {
        this.center = center;
    }

    /**
     * 半径
     */
    protected double getRadius() {
        return radiusVector.getSpeed();
    }

    /**
     * 半径
     */
    protected void setRadius(double radius) {
        radiusVector.setSpeed(radius);
    }

    /**
     * 当前的方向(度) ※0度 = 朝右 90度 = 朝下
     */
    protected double getAngleInDigree() {
        return radiusVector.getAngleInDigree();
    }

    /**
     * 当前的方向(度) ※0度 = 朝右 90度 = 朝下
     */
    protected void setAngleInDigree(double angleInDigree) {
        radiusVector.setAngleInDigree(angleInDigree);
    }

    /**
     * 角速度(度/帧)
     */
    protected double getAngleStepInDigree() {
        return angleStepInDigree;
    }

    /**
     * 角速度(度/帧)
     */
    protected void setAngleStepInDigree(double angleStepInDigree) {
        this.angleStepInDigree = angleStepInDigree;
    }

    /**
     * 
     * @param actor
     * @param center
     *            中心点
     * @param radius
     *            半径
     * @param angleInDigree
     *            朝向※0度 = 朝右 90度 = 朝下
     * @param angleStepInDigree
     *            角速度(度/帧)
     */
    public GoRoundAction(ISprite actor, IPoint2D center, double radius, double angleInDigree, double angleStepInDigree) {
        this(actor, center, new LinearVelocity2D(radius, angleInDigree), angleStepInDigree);
    }

    /**
     * TODO LinearVelocity2D和向量类还没有合并。此处的LinearVelocity2D并不是线速度，而是代表半径向量
     * 
     * @param actor
     * @param center
     * @param radiusVector
     *            半径向量
     * @param angleStepInDigree
     */
    public GoRoundAction(ISprite actor, IPoint2D center, LinearVelocity2D radiusVector, double angleStepInDigree) {
        this.actor = actor;
        this.center = center;
        this.radiusVector = radiusVector;
        this.angleStepInDigree = angleStepInDigree;
    }

//    @Override
    public void act() {
        radiusVector.turn(angleStepInDigree);
        actor.setRefPixelPosition(center.get2DX() + radiusVector.getDx(), center.get2DY() + radiusVector.getDy());
    }
}
